package com.cskaoyan.day3._02_listiterator;

import java.util.ArrayList;
import java.util.List;
import java.util.ListIterator;

/**
 * @author Common-zhou
 * @since 2023-03-01 10:57
 */
public class Demo1 {
    public static void main(String[] args) {
        //testListIterator1();

        //testListIterator2();

        //testListIterator3();

        //testListIterator4();

        //testListIterator5();

        //testListIterator6();

        // 可以用来干什么
        // 1.可以用来做遍历
        // 2.增删改
        // 3.

        testListIterator7();


    }

    /**
     * listIterator(int index)
     * 从0开始。最大支持传 size(length)
     * 1.如果我们想逆序遍历
     * list.listIterator(list.size());
     */
    private static void testListIterator7() {
        List<String> list = new ArrayList<>();

        list.add("景天叔叔");
        list.add("豆豆");
        list.add("小石头");

        ListIterator<String> listIterator = list.listIterator();

        //while (listIterator.hasNext()) {
        //    System.out.println(listIterator.next());
        //}

        System.out.println("=======================");
        //   景天叔叔    豆豆老师    小石头
        //                               |
        //
        //while (listIterator.hasPrevious()) {
        //    String previous = listIterator.previous();
        //    System.out.println(previous);
        //}


        //ListIterator<String> listIterator1 = list.listIterator(1);
        //System.out.println(listIterator1.hasNext());
        //System.out.println(listIterator1.next());


        //   景天叔叔    豆豆    小石头
        //                  |
        // 0

        // 现在想逆序遍历
        ListIterator<String> listIterator2 = list.listIterator(list.size());
        System.out.println(listIterator2.hasNext());

        while (listIterator2.hasPrevious()) {
            String previous = listIterator2.previous();
            System.out.println(previous);
        }


    }

    /**
     * set 设置刚刚遍历过的元素的值
     * 可以连续设置
     */
    private static void testListIterator6() {
        //void set(E e) : 修改刚刚遍历过的元素位置

        List<String> list = new ArrayList<>();

        list.add("景天叔叔");
        list.add("豆豆老师");
        list.add("小石头");

        ListIterator<String> listIterator = list.listIterator();

        // 不能直接调用set方法.没有遍历
        //listIterator.set("Java");

        listIterator.next();

        //   景天叔叔    豆豆老师    小石头
        //           |
        listIterator.set("奶茶哥哥");
        System.out.println(list);

        listIterator.set("优衣库男孩");
        System.out.println(list);

    }

    /**
     * <p>
     * add方法 相当于往缝里面添加了元素。
     * 添加了元素之后，指针会往后挪：
     * 1.    zs    ls    wu
     * |
     * 2.  listIterator.add("Java")
     * zs    ls    wu
     * |
     * zs   Java  ls   wu
     * |
     * </p>
     */
    private static void testListIterator5() {
        //void add(E e) : 添加一个数据到当前遍历位置
        List<String> list = new ArrayList<>();

        list.add("景天叔叔");
        list.add("豆豆老师");
        list.add("小石头");
        list.add("长风");
        list.add("咸鱼");

        ListIterator<String> listIterator = list.listIterator();
        //   景天叔叔     豆豆老师     小石头     长风     咸鱼
        //           |
        listIterator.next();

        listIterator.add("深澜");
        //   景天叔叔     深澜    豆豆老师     小石头     长风     咸鱼
        //                   |

        // 是哪里的数据发生了变化：
        // 数据的变动最终会存到原有的list中
        System.out.println(list);

        listIterator.add("泥鳅");

        //   景天叔叔     深澜   泥鳅    豆豆老师     小石头     长风     咸鱼
        //                         |

        System.out.println(list);


    }

    private static void testListIterator4() {
        List<String> list = new ArrayList<>();

        list.add("zs");
        list.add("ls");
        list.add("wu");


        ListIterator<String> listIterator = list.listIterator();


        //     zs    ls    wu
        //         |

        listIterator.next();
        listIterator.next();

        listIterator.previous();
        listIterator.remove();

        System.out.println(list);


    }

    private static void testListIterator3() {
        List<String> list = new ArrayList<>();

        list.add("zs");
        list.add("ls");
        list.add("wu");

        ListIterator<String> listIterator = list.listIterator();

        //      zs       ls     wu
        //   |

        // 下一个的下标
        System.out.println(listIterator.previousIndex());   //-1
        System.out.println(listIterator.nextIndex());   //0

        listIterator.next();
        //      zs       ls     wu
        //           |

        System.out.println(listIterator.previousIndex());   // 0
        System.out.println(listIterator.nextIndex());   // 1

        listIterator.next();
        //      zs       ls     wu
        //                   |

        System.out.println(listIterator.previousIndex());   // 1
        System.out.println(listIterator.nextIndex());   // 2

    }

    /**
     * hasNext()  判断下一个有没有元素
     * next() 指针往后挪，并且返回刚刚经过的元素; 如果没有元素，会抛异常
     * <p>
     * hasPrevious(): 判断上一个有没有元素
     * previous() 指针千挪，并且返回刚刚经过的元素
     */
    private static void testListIterator2() {
        List<String> list = new ArrayList<>();

        list.add("zs");
        list.add("ls");
        list.add("wu");

        ListIterator<String> listIterator = list.listIterator();

        while (listIterator.hasNext()) {
            String next = listIterator.next();
            System.out.println(next);
        }

        //     zs      ls      wu
        //  |
        System.out.println("=====================");
        boolean hasPrevious = listIterator.hasPrevious();
        System.out.println(hasPrevious);  // true
        System.out.println(listIterator.previous()); // wu

        System.out.println(listIterator.hasPrevious());  //true
        System.out.println(listIterator.previous()); // ls

        System.out.println(listIterator.hasPrevious());  //true
        System.out.println(listIterator.previous()); // zs

        System.out.println(listIterator.hasPrevious());  //false

        //NoSuchElementException
        //System.out.println(listIterator.previous());

    }

    private static void testListIterator1() {

        List<String> list = new ArrayList<>();

        list.add("zs");
        list.add("ls");
        list.add("wu");

        ListIterator<String> listIterator = list.listIterator();

        //     zs      ls       wu
        //                          |
        System.out.println(listIterator.hasNext());   //true
        System.out.println(listIterator.next());   //zs

        System.out.println(listIterator.hasNext());   // true
        System.out.println(listIterator.next()); // ls

        System.out.println(listIterator.hasNext());   // true
        System.out.println(listIterator.next()); // wu

        System.out.println(listIterator.hasNext());  // false


    }
}
